/**
 * 
 */
package com.dalonedrow.rpg.base.systems;

/**
 * @author Donald
 */
public interface Player<IO, PC> {
	void addBag(PC pc);
	/**
	 * Adds a certain amount of gold to a player.
	 * @param playerIO the player
	 * @param val the amount of gold
	 */
	void addGold(IO playerIO, float val);
	/**
	 * Expands the player's inventory by adding a bag.
	 * @param pc the player
	 */
	void addInventoryBag(PC pc);
	void addKey(PC pc, String key);
	void addQuest(PC pc, String quest, boolean load);
	void addRune(PC pc);
	/**
	 * Handles events when a player dies.
	 * @param pc the player
	 */
	void becomesDead(PC pc);
	boolean canStealItem(PC pc, IO io);
	void combineKey(PC pc, IO io) throws Exception;
	/**
	 * Computes FULL versions of player stats including equipped items, spells,
	 * and any other effects altering them.
	 * @param io the player object
	 * @throws Exception if an error occurs
	 */
	void computePlayerFullStats(IO io) throws Exception;
	/**
	 * Computes the player's secondary attributes.
	 * @param pc the player
	 */
	void computePlayerStats(PC pc);
	/**
	 * Forces player orientation to look at an interactive object.
	 * @param io the interactive object
	 */
	void forcePlayerLookAtIO(IO io);
	/**
	 * Updates some player stats/conditions that are dependent on time.
	 * @param pc the player
	 * @param delay the time in nanoseconds since the last frame check
	 */
	void frameCheck(PC pc, float delay);
	/**
	 * Updates many player conditions, stats, animations, etc., that are not
	 * dependent on time.
	 * @param pc the player
	 */
	void frameUpdate(PC pc);
	/**
	 * Updates the player when the game is reset.
	 * @param pc the player
	 */
	void gameReset(PC pc);
	/**
	 * Gets the experience points necessary to achieve a given level.
	 * @param profession the profession
	 * @param level the level
	 * @return long
	 */
	long getXPforLevel(int profession, int level);
	/**
	 * Initializes a player.
	 * @param pc the player
	 */
	void initializePlayer(PC pc);
	void initKeyRing(PC pc);
	void initQuest(PC pc);
	void initQuestFirst(PC pc);
	boolean isInFightMode(PC pc);
	/**
	 * Manages player Level Up event.
	 * @param pc the player
	 */
	void levelUp(PC pc);
	void loadHeroAnimations(PC pc);
	PC makeAverageHero();
	PC makeFreshHero();
	PC makePowerfulHero();
	/**
	 * Manages the death visual.
	 * @param pc the player
	 */
	void manageDeath(PC pc);
	/**
	 * Manages a player's movement. May not be used?
	 * @param pc the player
	 */
	void manageMovement(PC pc);
	/**
	 * Manages a player's animations. May not be used?
	 * @param pc the player
	 */
	void manageVisual(PC pc);
	void modifyXP(PC pc, float val);
	/**
	 * Modifies player XP by adding a certain amount to it.
	 * @param pc the player
	 * @param val the amount of XP being added
	 */
	void modifyXP(PC pc, long val);
	/**
	 * Handles a poisoning event for a player.
	 * @param pc the player
	 */
	void poison(PC pc);
	PC quickGeneration();
	void removeInvisibility(PC pc);
	void removeRune(PC pc);
	void startNewQuest(PC pc);
}
